home *** CD-ROM | disk | FTP | other *** search
/ Aminet 48 / Aminet 48 (2002)(GTI - Schatztruhe)[!][Apr 2002].iso / Aminet / text / edit / vim60rt.lha / Vim / vim60 / syntax / xpm.vim < prev    next >
Encoding:
Text File  |  2001-05-10  |  4.3 KB  |  145 lines

  1. " Vim syntax file
  2. " Language:    X Pixmap
  3. " Maintainer:    Ronald Schild <rs@scutum.de>
  4. " Last Change:    2001 May 09
  5. " Version:    5.4n.1
  6.  
  7. " For version 5.x: Clear all syntax items
  8. " For version 6.x: Quit when a syntax file was already loaded
  9. if version < 600
  10.   syntax clear
  11. elseif exists("b:current_syntax")
  12.   finish
  13. endif
  14.  
  15. syn keyword xpmType        char
  16. syn keyword xpmStorageClass    static
  17. syn keyword xpmTodo        TODO FIXME XXX  contained
  18. syn region  xpmComment        start="/\*"  end="\*/"  contains=xpmTodo
  19. syn region  xpmPixelString    start=+"+  skip=+\\\\\|\\"+  end=+"+  contains=@xpmColors
  20.  
  21. if has("gui_running")
  22.  
  23. let color  = ""
  24. let chars  = ""
  25. let colors = 0
  26. let cpp    = 0
  27. let n      = 0
  28. let i      = 1
  29.  
  30. while i <= line("$")        " scanning all lines
  31.  
  32.    let s = matchstr(getline(i), '".\{-1,}"')
  33.    if s != ""            " does line contain a string?
  34.  
  35.       if n == 0            " first string is the Values string
  36.  
  37.      " get the 3rd value: colors = number of colors
  38.      let colors = substitute(s, '"\s*\d\+\s\+\d\+\s\+\(\d\+\).*"', '\1', '')
  39.      " get the 4th value: cpp = number of character per pixel
  40.      let cpp = substitute(s, '"\s*\d\+\s\+\d\+\s\+\d\+\s\+\(\d\+\).*"', '\1', '')
  41.  
  42.      " highlight the Values string as normal string (no pixel string)
  43.      exe 'syn match xpmValues /'.s.'/'
  44.      hi link xpmValues String
  45.  
  46.      let n = 1        " n = color index
  47.  
  48.       elseif n <= colors    " string is a color specification
  49.  
  50.      " get chars = <cpp> length string representing the pixels
  51.      " (first incl. the following whitespace)
  52.      let chars = substitute(s, '"\(.\{'.cpp.'}\s\).*"', '\1', '')
  53.  
  54.      " now get color, first try 'c' key if any (color visual)
  55.      let color = substitute(s, '".*\sc\s\+\(.\{-}\)\s*\(\(g4\=\|[ms]\)\s.*\)*\s*"', '\1', '')
  56.      if color == s
  57.         " no 'c' key, try 'g' key (grayscale with more than 4 levels)
  58.         let color = substitute(s, '".*\sg\s\+\(.\{-}\)\s*\(\(g4\|[ms]\)\s.*\)*\s*"', '\1', '')
  59.         if color == s
  60.            " next try: 'g4' key (4-level grayscale)
  61.            let color = substitute(s, '".*\sg4\s\+\(.\{-}\)\s*\([ms]\s.*\)*\s*"', '\1', '')
  62.            if color == s
  63.           " finally try 'm' key (mono visual)
  64.           let color = substitute(s, '".*\sm\s\+\(.\{-}\)\s*\(s\s.*\)*\s*"', '\1', '')
  65.           if color == s
  66.              let color = ""
  67.           endif
  68.            endif
  69.         endif
  70.      endif
  71.  
  72.      " Vim cannot handle RGB codes with more than 6 hex digits
  73.      if color =~ '#\x\{10,}$'
  74.         let color = substitute(color, '\(\x\x\)\x\x', '\1', 'g')
  75.      elseif color =~ '#\x\{7,}$'
  76.         let color = substitute(color, '\(\x\x\)\x', '\1', 'g')
  77.      " nor with 3 digits
  78.      elseif color =~ '#\x\{3}$'
  79.         let color = substitute(color, '\(\x\)\(\x\)\(\x\)', '0\10\20\3', '')
  80.      endif
  81.  
  82.      " escape meta characters in patterns
  83.      let s = escape(s, '/\*^$.~[]')
  84.      let chars = escape(chars, '/\*^$.~[]')
  85.  
  86.      " now create syntax items
  87.      " highlight the color string as normal string (no pixel string)
  88.      exe 'syn match xpmCol'.n.'Def /'.s.'/ contains=xpmCol'.n.'inDef'
  89.      exe 'hi link xpmCol'.n.'Def String'
  90.  
  91.      " but highlight the first whitespace after chars in its color
  92.      exe 'syn match xpmCol'.n.'inDef /"'.chars.'/hs=s+'.(cpp+1).' contained'
  93.      exe 'hi link xpmCol'.n.'inDef xpmColor'.n
  94.  
  95.      " remove the following whitespace from chars
  96.      let chars = substitute(chars, '.$', '', '')
  97.  
  98.      " and create the syntax item contained in the pixel strings
  99.      exe 'syn match xpmColor'.n.' /'.chars.'/ contained'
  100.      exe 'syn cluster xpmColors add=xpmColor'.n
  101.  
  102.      " if no color or color = "None" show background
  103.      if color == ""  ||  substitute(color, '.*', '\L&', '') == 'none'
  104.         exe 'hi xpmColor'.n.' guifg=bg'
  105.         exe 'hi xpmColor'.n.' guibg=NONE'
  106.      else
  107.         exe 'hi xpmColor'.n." guifg='".color."'"
  108.         exe 'hi xpmColor'.n." guibg='".color."'"
  109.      endif
  110.      let n = n + 1
  111.       else
  112.      break        " no more color string
  113.       endif
  114.    endif
  115.    let i = i + 1
  116. endwhile
  117.  
  118. unlet color chars colors cpp n i s
  119.  
  120. endif        " has("gui_running")
  121.  
  122. " Define the default highlighting.
  123. " For version 5.7 and earlier: only when not done already
  124. " For version 5.8 and later: only when an item doesn't have highlighting yet
  125. if version >= 508 || !exists("did_xpm_syntax_inits")
  126.   if version < 508
  127.     let did_xpm_syntax_inits = 1
  128.     command -nargs=+ HiLink hi link <args>
  129.   else
  130.     command -nargs=+ HiLink hi def link <args>
  131.   endif
  132.  
  133.   HiLink xpmType        Type
  134.   HiLink xpmStorageClass    StorageClass
  135.   HiLink xpmTodo        Todo
  136.   HiLink xpmComment        Comment
  137.   HiLink xpmPixelString    String
  138.  
  139.   delcommand HiLink
  140. endif
  141.  
  142. let b:current_syntax = "xpm"
  143.  
  144. " vim: ts=8:sw=3:noet:
  145.